
\chapter{La problemática en los tratamientos contra el VIH}

\section{Introducción}
Actualmente el desarrollo de las terapias VIH está basado en una serie de normas internacionales (\url{http://www.aidsinfo.nih.gov/guidelines/}) propuestas por Department of Health and Human Services (DHHS) E.U.(\url{http://www.hhs.gov}) y llevadas a cabo por profesionales del área de infectología, virología y bioquímica. Vale la pena mencionar que las normas de tratamiento son desarrolladas de forma empírica y basándose en experiencias propias de los profesionales que las formularon.
Dado un paciente infectado pueden existir varias terapias para tratarlo. Está en el criterio del profesional el poder elegir la mejor de estas terapias. El problema radica, en elegir la o las mejores de acuerdo a las características del paciente, para lograrlo hay que analizar todo un conjunto de variables asociadas, cuya complejidad excede por mucho a las metodologías de análisis utilizadas hasta el momento, tomando en cuenta ademas, que se puede introducir una gran cantidad de errores por la aplicación del método.
A continuación daremos una breve descripción de las metodologías empleadas en la actualidad:

	\subsection{El proceso de tratamiento en Estados Unidos}
	Una vez diagnosticada la enfermedad, se hace un análisis de CD4. De acuerdo a la cantidad de CD4 por micro litro, se decide comenzar o no el tratamiento. Generalmente se empieza a tratar pacientes con menos de 350 CD4 por micro litro. 
	Es mandatorio realizar el estudio de resistencias y la secuenciación antes de comenzar el tratamiento.
	En base a los lineamientos de la DHHS y al historial clínico del paciente se decide la mejor terapia.
	
	%-----------------------------------------------------------------------------
	
	En Estados Unidos el tratamiento mas corriente en la actualidad consta de:
	Comenzar con $3TC (Lamivudine)$ o $FTC + Tenofovir + Efavirenz$.
	Al igual que Argentina pero se remplaza el $AZT$ por el $Tenofovir$ que es otro análogo de nucleótido pero algo menos toxico.
	En Estados Unidos existe un fármaco que contiene las tres drogas denominado $Tripla$, alternativamente se aplican $3TC + Tenofovir + Atazanavir/r $(un inhibidor de la proteasa activado por Ritonavir).	
	
	%-----------------------------------------------------------------------------
	
	\subsection{El proceso de tratamiento en Argentina}
	En nuestro país una vez diagnosticada la enfermedad, se efectúa el análisis de CD4.Tanto en Argentina como en Estados Unidos hay consenso de tratar a los pacientes con menos de 350 CD4 por micro litro.
	No se realiza la secuencia al inicio del tratamiento (al menos no en forma regular o mandatoria).
		
	El tratamiento inicial mas frecuente consiste en:
	Comenzar con $3TC + AZT + Efavirenz$ (los dos primeros son análogos de nucleótidos y el tercero es un inhibidor de la transcriptasa no análogo de nucleótido). La alternativa es usar en lugar de $Efavirenz$, un inhibidor de la proteasa, como ser Saquinavir/r (potenciado Ritonavir).
	
\section{Análisis del problema}
Este trabajo busca obtener las mejores terapias para tratar un paciente y a su vez garantizar que las terapias cumplan lineamientos básicos:
\begin{itemize}
\item Prolongar la vida y mejorar su calidad en el largo plazo.
\item Reducir los niveles del virus por debajo del límite de detección con las pruebas actuales (menos de 50 copias del ARN del VIH), o al menor número posible durante el mayor tiempo posible.
\item Minimizar la toxicidad de los medicamentos a la vez que se manejan los efectos secundarios y la interacción entre los distintos medicamentos.
\end{itemize}
Ver \cite{Th08} y \cite{DF02} para más información.

Esto se basa en resolver la problemática de las resistencias cruzadas, es decir, qué antirretrovirales aplicar y en qué orden para poder prolongar al máximo la efectividad de la terapia. Para dar una solución a este problema desarrollamos un sistema informático que
devuelve una lista con las $n$ mejores terapias para tratar un paciente,
ordenadas de más recomendable a menos recomendable.

Para encontrar las terapias adecuadas se toman en cuenta los antirretrovirales disponibles y la secuencia viral del paciente y los criterios especificados por el profesional. Estos criterios de evaluación deben ser considerados de alguna forma en el proceso de cálculo, pudiendo ser estos, la toxicidad, embarazo, coinfección, interacciones, etc.
Es decir, estamos ante un claro ejemplo de Medicina Personalizada ya que se hace  énfasis en el uso sistemático de información sobre un paciente para seleccionar u optimizar terapias para dicho individuo.

\subsection{Los problemas relacionados}
El Análisis inicial desemboca en una serie de problemas asociados los cuales no están dentro del alcance de este trabajo. Estos pueden ser clasificados en:

\subsubsection{Computacionales}

\begin{itemize}
\item Referidos a eficiencia de calculo: si bien siempre se seleccionaron los algoritmos y estructuras mas adecuadas para el desarrollo del sistema, consideramos que pueden optimizarse muchos de los métodos aquí establecidos impactando principalmente en el tiempo de calculo y en segunda medida en los recursos requeridos por sistema .
\item Extensiones fáciles de desarrollar: se planteo en principio proveer un manejo de las extensiones o plugins de forma simple y clara para los usuarios finales del sistema.Se optó por proveer plugins a través de librerías dinámicas del sistema.
\end{itemize}
	
\subsubsection{Biológicos}

\begin{itemize}
\item Manejo de probabilidades asociadas a la efectividad del antirretroviral y la mutación del virus: este trabajo abarca un enfoque de tipo cualitativo-algorítmico, por lo cual no se considero el tratamiento de probabilidades y los tiempos de acción efectiva de un antirretroviral. De cualquier modo, esta posibilidad de extensión existe a través del plugin aunque su soporte por medio del sistema es limitado.
\item Capacidad de análisis en paralelo de una población viral, en lugar de solo la cepa más predominante. 
\end{itemize}
	
\subsubsection{Terapéuticos}

\begin{itemize}
\item Periodo de tiempo en el cual se debe modificar el tratamiento: la posibilidad de que el sistema determine cuando una terapia deja de ser efectiva para el paciente.
\end{itemize}
	
\subsection{Requerimientos Funcionales}
En base al estudio del problema que se planteó con anterioridad concluimos que el sistema debe proveer el siguiente funcionamiento básico:

\begin{enumerate}
\item Cargar una secuencia nucleotídica de ARN.
\item Cargar una base de datos de antirretrovirales.
\item Incorporar los criterios del profesional a través de un punto extensible, en este caso un plugin.
\item A partir de la secuencia inicial seleccionar los antirretrovirales que aplican.
\item Combinar los antirretrovirales de acuerdo a los requerimientos del usuario.
\item Generar una lista de mutantes como consecuencia de aplicar la combinación. 
\item Procesar cada mutante.
\item Generar una terapia parcial a partir de la mutante y asignar un puntaje acorde a los criterios introducidos por el profesional.
\item Establecer un Ranking de terapias de acuerdo a sus puntajes.
\item Para cada mutante se repite el procedimiento desde el paso 4, hasta que no hayan más antirretrovirales que aplicar o se especifique su terminación.
\item Se devuelve un listado ordenado de terapias junto con información asociada a las mismas.\\
\end{enumerate}	

Una vez que obtuvimos los lineamientos generales del sistema planteamos una serie de requerimientos funcionales. Cada uno cubre alguno de los requisitos planteados por el usuario o derivan de estos.

A lo largo del desarrollo del sistema muchos requerimientos se modificaron, surgieron nuevos y algunos se descartaron. Para tener una visión más detallada de la evolución de los mismos a lo largo de todo el proceso de desarrollo se aconseja leer el Documento de Requerimientos Funcionales anexado al trabajo. 

A continuación se listan los requerimientos funcionales finales del sistema.

\begin{itemize}

\item \textbf{Nombre del Requerimiento:} Codificación en Lenguaje C++ (RF1).\\
   	\textbf{Propósito:} Realizar la programación del sistema en lenguaje C++ con orientación a objetos. Esto fue requerido por parte de Fu.De.PAN siendo este el lenguaje estándar para la mayoría de sus proyectos por su performance, reusabilidad y extensión.\\   	


\item \textbf{Nombre del Requerimiento:} Carga de secuencia ARN del virus, base de datos de antirretrovirales y parámetros (RF2).\\
   	\textbf{Propósito:} Cargar un archivo en formato FASTA, establecer los parámetros requeridos por el plugin.\\
   	\textbf{Input:} Archivo en formato FASTA, archivo de la base de datos, Valores de los parámetros requeridos por el plugin.\\
    \textbf{Procesamiento:} cargar el archivo y convertirlo a una estructura de datos adecuada para su manipulación. Un proceso similar los parámetros del plugin.\\
    \textbf{Output:} Estructura de datos asociada al archivo FASTA y estructura de datos con los parámetros.\\
	\textbf{Descripción:} El usuario carga el archivo haciendo click en el botón Examinar.
                   Si el formato no es correcto se muestra un mensaje de error.
                   Se configuran los parámetros.
                   Si los parámetros están en formato inadecuado o son inconsistentes se muestra un mensaje de error.
                   Se hace click en Procesar.                  
             
             
\item \textbf{Nombre del Requerimiento:} Verificar qué antirretroviral Aplica (RF3).\\
	\textbf{Propósito:} Verificar los antirretrovirales que tienen efectos sobre el virus para descartar los innecesarios.\\
	\textbf{Input:} Cadena de Aminoácidos, Base de Datos de antirretrovirales.\\
	\textbf{Procesamiento:} Compara cada antirretroviral con las secuencias a las cuales son aplicables y los que no corresponden a esta, son descartados.\\
	\textbf{Output:} Conjunto de antirretrovirales que aplican a este virus inicial (cadena de proteínas).\\
                  

\item \textbf{Nombre del Requerimiento: }Administrador de Plugins (RF4).\\
	\textbf{Propósito:} Poder utilizar una serie de componentes o plugins para extender la funcionalidad del sistema.\\
	\textbf{Input:} Plugin\\
	\textbf{ Procesamiento: }Carga del plugin.\\
	\textbf{Output:} Mensaje de Error o mostrar parámetros requeridos por el plugin en la GUI.\\
	\textbf{Descripción:} Se selecciona la opción Examinar para buscar el plugin y se da Aceptar.
	Si el plugin es un formato incorrecto se muestra un mensaje de error. Si el plugin es inconsistente con la Base de Datos de antirretrovirales se muestra un mensaje de error.
	En caso contrario se muestran las opciones de configuración del plugin\\
	
	\begin{enumerate}		
	\item \textbf{Nombre del Sub Requerimiento:} Chequear la consistencia del plugin con la Base de Datos (RF4.1).\\
		\textbf{Propósito:} Poder comprobar que el plugin sea consistente con los datos para evitar cálculos erróneos.\\
		\textbf{Input:} Plugin.\\
		\textbf{ Procesamiento:} el plugin tiene acceso a una versión de solo lectura de la BD y hace una pre evaluación de estos.\\
		\textbf{Output:} Mensaje de éxito o fracaso.\\		
		
	\item \textbf{Nombre del Sub Requerimiento:} configurar lista de parámetros requeridos (RF4.2).\\
		\textbf{Propósito:} Permitirle al plugin acceder a datos en tiempo de ejecución.\\
		\textbf{Input:} Plugin.\\
		\textbf{ Procesamiento:El Administrador solicita al plugin aquellos parámetros necesarios para hacer los cálculos. Estos son mostrados al usuario a través de la GUI, inicializados por este y retornados al plugin.}\\
		\textbf{Output:} Mensaje de éxito o fracaso en caso de errores en los valores establecidos por el usuario.\\
				
	\item \textbf{Nombre del Sub Requerimiento:} Adaptar el sistema de acuerdo a las modificaciones planteadas por el plugin (RF4.3).\\
		\textbf{Propósito:} Permitirle al implementador de plugin establecer los algoritmo mas eficiente y adaptaciones necesarias para mejorar el desempeño del sistema y adecuarlo a sus requerimientos.\\
		\textbf{Input:} Plugin.\\
		\textbf{ Procesamiento:} adaptar cada funcionalidad del plugin sobre el sistema\\
		\textbf{Output:} Mensaje de éxito o fracaso.\\
	\end{enumerate}
		
		
\item \textbf{Nombre del Requerimiento: } Funcionalidades del Plugin (RF5).\\
	\textbf{Propósito:} definir las capacidades del plugin y sus efectos sobre el sistema.\\

	\begin{enumerate}		
	\item \textbf{Nombre del Sub Requerimiento:} Algoritmo de generación (RF5.1).\\
		\textbf{Propósito:} Permitirle al usuario establecer el algoritmo más adecuado para construir el espacio de búsqueda.\\

	\item \textbf{Nombre del Sub Requerimiento:} Función de puntuación de terapias (RF5.2).\\
		\textbf{Propósito:} Proveer una función de puntuación (scoring), la cual recibía una terapia y retornaba un valor.\\
			  	
	\item \textbf{Nombre del Sub Requerimiento:} Función de poda (RF5.3).\\
		\textbf{Propósito:} proveer una función de poda del espacio de búsqueda la cual determinaba si continuar o no con una terapia.\\
			  
	\item \textbf{Nombre del Sub Requerimiento:} Validación de base de Datos. (RF5.4).\\
		\textbf{Propósito:} proveer una función que valide la base de datos con la que va a trabajar.\\
		
	\item \textbf{Nombre del Sub Requerimiento:} Configuración de Matriz de distancia. (RF5.5).\\
		\textbf{Propósito:} permitir establecer las distancias entre el nucleótido original y el nucleótido mutado.
		
	\item \textbf{Nombre del Sub Requerimiento:} Injerencia del plugin sobre los datos procesados, durante generación del espacio de búsqueda (RF5.6).\\
		\textbf{Propósito:} Darle mayor libertad al implementador del plugin para manejar tanta información como requiera durante la generación de terapias.\\
		
	\item \textbf{Nombre del Sub Requerimiento:} Injerencia del plugin sobre la elección de algoritmos a aplicar en cada paso de las terapias generadas (RF5.7).\\
		\textbf{Propósito:} El plugin podría elegir algoritmos de scoring, poda y política combinatoria diferentes por cada paso de la generación de una terapia.\\
	\end{enumerate}	
	
		
\item \textbf{Nombre del Requerimiento:} Generador de árbol de terapias (RF6).\\
    \textbf{Propósito:} Construir un árbol cuya raíz sea la secuencia inicial del virus. Además, construye cada nivel con las mutantes obtenidas luego de aplicar un conjunto de antirretrovirales. Una terapia debe crecer hasta que no queden antirretrovirales por aplicar, se haya encontrado una cepa resistente a todos o el plugin a través de la función de poda decida no continuarla.\\
	\textbf{Input:} Cadena de Aminoácidos (secuencia viral inicial), conjunto de antirretrovirales que aplican a la secuencia, función de poda introducida por el plugin y algoritmo de generación propuesto por este.\\
	\textbf{Procesamiento:} dada una cepa, analizamos los antirretrovirales que son efectivos contra esta, los agrupamos y aplicamos. Se crean nodos nuevos por cada mutante del virus, seleccionamos aquella de menor distancia evolutiva (menor distancia con la cepa del nodo padre). Repetimos este proceso de acuerdo a lo establecido por el algoritmo de generación hasta que no se puedan continuar más terapias.\\
	\textbf{ Output:} Árbol de terapias. \\


\item \textbf{Nombre del Requerimiento:} Ranking de Terapias (RF7).\\
	\textbf{Propósito:} establecer el conjunto de terapias optimas para tratar el paciente.\\
	\textbf{Input:} árbol de terapias, función de Scoring introducida por el plugin.\\
	\textbf{ Procesamiento:} Se recorre el árbol utilizando un algoritmo establecido por el plugin y se selecciona las aplicaciones de antirretrovirales más eficientes, de acuerdo a la función de scoring.\\
		\textbf{Output:} Listado ordenado de Terapias.\\
		           
\begin{enumerate}
\item \textbf{Nombre del Sub Requerimiento:} Ranking de Terapias (RF7.1).\\
	\textbf{Propósito:} Notando la utilidad de este tipo de objetos, se opto por que este sea un rankeador genérico de objetos.
	\textbf{Input:} objetos, función de comparación entre objetos y cantidad de elementos (top).\\
	\textbf{ Procesamiento:} a medida que se recibe un objeto se lo compara con los que están actualmente en el ranking. Luego se introduce en el ranking o se lo descarta.
	\textbf{Output:} Listado ordenado objetos.\\
\end{enumerate}

                
	                            
\item \textbf{Nombre del Requerimiento:} Muestra de los Resultados (RF8).\\
	\textbf{Propósito:} Mostrar en forma adecuada y clara los resultados calculados.\\
		\textbf{Input:} Listado de Terapias.\\
		\textbf{ Procesamiento:} Ordenar los resultados de las terapias por importancia. Presentarlos en forma de columnas o como salida de un archivo.
		\textbf{Output:} Listado de terapias.\\


\item \textbf{Nombre del Requerimiento: }Librería para plugin - libplugin (RF9).\\
	\textbf{Propósito:} Proveer un conjunto de librerías, con todo lo necesario para desarrollar un plugin en C++ y un constructor genérico de librerías dinámicas.\\
	\textbf{Propósito:} Proporcionarle al usuario facilidades para desarrollar plugins.\\
	\textbf{Input:} Archivo fuente (extensión $.cpp$).\\
	\textbf{ Procesamiento:} compilar el archivo fuente.\\
	\textbf{Output:} Librería dinámica de C++ (extensión $.so$).\\

\begin{enumerate}	
\item \textbf{Nombre del Sub Requerimiento:} Proveer una serie de políticas estándares de generación para el espacio de búsqueda (RF9.1).\\
	\textbf{Propósito:} Permitirle al implementador de plugin contar con distintas políticas básicos de generación.\\
	\textbf{Descripción:} proveer algoritmos de generación en profundidad, en anchura y el que solo considera las N mejores opciones en cada paso.	\\
	

\item \textbf{Nombre del Sub Requerimiento:} Proveer una serie de algoritmos estándares para combinación  de antirretrovirales (RF9.2).\\
	\textbf{Propósito:} Proveer al implementador de plugin un conjunto de algoritmos de combinación pre diseñados y que estos puedan combinarse para formar algoritmos más complejos.\\
	\textbf{Descripción:} proveer algoritmos para combinación de antirretrovirales: combinación newtoneana, listador simple, secuencial de un grupo de combinadores, paralelo de un grupo de combinadores y combinador Vacío.		
\end{enumerate}	

	
\item \textbf{Nombre del Requerimiento:} Plugin implementado sobre librerías dinámicas de C++ (RF10).
	\textbf{Propósito:} Proveer independencia entre el sistema y el plugin sin necesidad de re compilar todo el código por causa de modificaciones en una de las partes. Posibilidad de acceder a las funciones del plugin en tiempo de ejecución.\\

	
\item \textbf{Nombre del Requerimiento:} Combinador de Antirretrovirales (RF11).\\
	\textbf{Propósito:} Se busca emular el hecho de atacar al virus con cócteles de antirretrovirales.\\
	\textbf{Input:} conjunto de antirretrovirales que aplican al virus.\\
	\textbf{ Procesamiento:} generar todas las posibles combinaciones de tamaño entre N y M. Con N y M establecidas por el usuario.\\
	\textbf{Output:} Conjunto de conjuntos de antirretrovirales.\\
	

\item \textbf{Nombre del Requerimiento:} Manejo del flujo de datos (RF12).\\
	\textbf{Propósito:} Debido a el volumen de información, la complejidad de calculo y el tiempo que tarda en generar resultados, el sistema debe confeccionar un ranking y retornar las terapias parciales, a medida que estas se generan. De esta forma, si se interrumpe la ejecución del sistema, el usuario cuenta con las $N$ mejores terapias producidas hasta ese momento.
De la misma forma, se debe liberar las terapias que ya fueron procesadas, para mejorar el uso de memoria en tiempo de ejecución. 
		

\item \textbf{Nombre del Requerimiento:} Múltiples algoritmos combinatiorios(RF13).\\
	\textbf{Propósito:} El sistema debe poder convivir con múltiples algoritmos para combinación de antirretrovirales de forma simultanea en distintos lugares del espacio de búsqueda.\\

\end{itemize}



	
